package com.zjsru.oneDay202212;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: CookLee
 * @Date: 2022/12/3
 * 字符串中第二大的数字
 * 给你一个混合字符串 s ，请你返回 s 中 第二大 的数字，如果不存在第二大的数字，请你返回 -1 。
 *
 * 输入：s = "dfa12321afd"
 * 输出：2
 * 解释：出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
 *
 * 输入：s = "abc1111"
 * 输出：-1
 * 解释：出现在 s 中的数字只包含 [1] 。没有第二大的数字。
 *
 */
public class SecondHighest {
    
    /***
     * 模拟,定义出数字字符串
     * */
    private static String NUMBER = "1234567890";
    
    public int secondHighest1(String s) {
        List<String> list = new ArrayList<>();
        for (char c : s.toCharArray()) {
            if (NUMBER.contains(String.valueOf(c))) {
                list.add(String.valueOf(c));
            }
        }
        List<String> collect = list.stream().distinct().collect(Collectors.toList());
        Collections.sort(collect);
        return collect.size() <= 1 ? -1 : Integer.parseInt(collect.get(collect.size() - 2));
    }
    
    /**
     * 针对上一个方案的代码冗余，运行时间反而变慢了
     * 不算是优化
     */
    public int secondHighest2(String s) {
        List<String> list = new ArrayList<>();
        for (char c : s.toCharArray()) {
            if (NUMBER.contains(String.valueOf(c))) {
                list.add(String.valueOf(c));
            }
        }
        List<String> collect = list.stream().sorted(Comparator.reverseOrder()).distinct().collect(Collectors.toList());
        int length = collect.size();
        return length <= 1 ? -1 : Integer.parseInt(collect.get(1));
    }
    
    /**
     * 另一个思路,模拟
     * */
    public int secondHighest3(String s) {
        int first = -1, second = -1;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //为字母则跳过
            if (Character.isDigit(c)) {
                int num = c - '0';
                if (num > first) {
                    // 该情况下说明当前最大的数字为 num，第二大的数字为 first，则此时更新 second 等于当前的 first，更新当前的 first 为 num即可。
                    second = first;
                    first = num;
                } else if (second < num && first > num) {
                    // 考虑second<num<first的情况，最大的数字为 first，只更新second
                    second = num;
                }
            }
        }
        return second;
    }
    
    public static void main(String[] args) {
        SecondHighest secondHighest = new SecondHighest();
        String s = "ck077";
        System.out.println(secondHighest.secondHighest3(s));
    }
}
